/**
* 	TODO:   Detectar la no presencia de cámara y despachar un evento personalizado
*			Unificar eventos
 			Incorporar métodos para establecer calidad, framerate, etc.
*/
package com.drusunlimited.input
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.MovieClip;
	import flash.events.ActivityEvent;
	import flash.events.Event;
	import flash.events.StatusEvent;
	import flash.geom.Matrix;
	import flash.media.Camera;
	import flash.media.Video;
	/**
		* 	Crea un objeto camera básico, despachando sus correspondientes eventos.
		*	Incluye una funcionalidad básica para capturar imágenes de la cámara.
	**/
	public class Webcam extends MovieClip{
		private var _camera:Camera;
		private var _video:Video;
		private var _width:uint;
		private var _height:uint;
		
		public function Webcam(w:uint=320, h:uint=240, fps:uint=25):void{
			_width=w;
			_height=h;
			_camera=Camera.getCamera();
			trace(_camera);
			trace(Camera.names.toString());
			if(_camera==null || Camera.names.length < 1){
				trace("no hay camara o la camara está en uso");
				return;
			}
			setListeners();
			_camera.setMode(_width,_height, fps);
			_camera.setMotionLevel(1);
			_video=new Video(_camera.width, _camera.height);
			_video.attachCamera(_camera);
			addChild(_video);
		}
		
		public function shot(w:uint=320, h:uint=240):Bitmap{
			var bmpd:BitmapData=new BitmapData(w, h);
			var matriz:Matrix=new Matrix(w/_width, 0, 0, h/_height, 0, 0);
			bmpd.draw(_video, matriz, null, null, null, true);
			var bmp:Bitmap=new Bitmap(bmpd, "auto", true);
			return bmp; 
		}
		
		
		public function get activity():Number{
			return _camera.activityLevel;
		}

		private function setListeners():void{
			_camera.addEventListener(StatusEvent.STATUS, statusHandler);
			_camera.addEventListener(ActivityEvent.ACTIVITY, activityHandler);
			_camera.addEventListener(Event.ACTIVATE, activateHandler);
			_camera.addEventListener(Event.DEACTIVATE, deactivateHandler);
		}
				
		private function activateHandler(event:Event):void{
			dispatchEvent(event);
		}
		
		private function deactivateHandler(event:Event):void{
			dispatchEvent(event);
		}
		
		private function activityHandler(event:ActivityEvent):void{
			dispatchEvent(event);
		}
		
		private function statusHandler(event:StatusEvent):void{
			dispatchEvent(event);
		}
	}
}